/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.xml.bind.ParseConversionEvent;
import model.Cliente;

/**
 *
 * @author Marcel Vinicius Kohls
 */
public class DAOCliente {

    private final String SQL_LISTA_TESTE = "SELECT cli_codigo, cli_nome, cli_endereco FROM clientes ORDER BY cli_nome";
    private final String SQL_LISTA_CLIENTES = "SELECT cli_codigo, cli_nome FROM clientes ORDER BY cli_nome";
    private final String SQL_BUSCA_POR_CODIGO = "SELECT cli_codigo, cli_nome, cli_cnpjcpf, cli_endereco FROM clientes WHERE cli_codigo = ?";
    private final String SQL_ALTERAR = "UPDATE clientes set cli_nome=?, cli_cnpjcpf=?, cli_endereco=? WHERE cli_codigo = ?";
    private final String SQL_INCLUIR = "INSERT INTO clientes (cli_nome, cli_cnpjcpf, cli_endereco) VALUES (?,?,?)";

    public ResultSet getListaTeste() throws Exception {

        try {
            return Conexao.getStatement().executeQuery(SQL_LISTA_TESTE);
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

    }

    /**
     * Retorna um resultSet com o resultado do comando de sql da lista dos clientes
     * @return
     * @throws Exception
     */
    public ResultSet getListaClientes() throws Exception {
        //PreparedStatement sqlQuery = null;
        //ResultSet sqlResult = null;

        try {
            //sqlQuery  = Conexao.getConnection().prepareStatement(SQL_LISTA_CLIENTES);
            //sqlResult = sqlQuery.executeQuery();

            //return sqlResult;
            return Conexao.getStatement().executeQuery(SQL_LISTA_CLIENTES);
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * retorna uma instancia de cliente a partir de uma busca no sql 
     * pelo código passado como parametro.
     * @param pCodCliente
     * @return
     * @throws Exception
     */
    public Cliente getClientePorCodigo(int pCodCliente) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        Cliente resultadoCliente = new Cliente();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_BUSCA_POR_CODIGO);
            sqlQuery.setInt(1,  pCodCliente );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoCliente = getValorDoResultado(sqlResult);

            return resultadoCliente;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

    }

    /**
     * monta um objeto do tipo cliente, baseado em um retorno de pesquisa de sql em clientes
     * @param pSqlResult
     * @return
     */
    public Cliente getValorDoResultado(ResultSet pSqlResult) throws Exception {
        Cliente objetoRetorno = new Cliente();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCli_Codigo(pSqlResult.getInt("cli_codigo"));
                objetoRetorno.setCli_Nome(pSqlResult.getString("cli_nome"));
                objetoRetorno.setCli_CNPJCPF(pSqlResult.getString("cli_cnpjcpf"));
                objetoRetorno.setCli_Endereco(pSqlResult.getString("cli_endereco"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }

    /**
     * Salva uma instância de cliente no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pCliente
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(Cliente pCliente) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCliente.getCli_Codigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setString(1, pCliente.getCli_Nome());
                sqlQuery.setString(2, pCliente.getCli_CNPJCPF());
                sqlQuery.setString(3, pCliente.getCli_Endereco());
                sqlQuery.setInt(4, pCliente.getCli_Codigo());

                System.out.println("DAOCliente.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR);

                sqlQuery.setString(1, pCliente.getCli_Nome());
                sqlQuery.setString(2, pCliente.getCli_CNPJCPF());
                sqlQuery.setString(3, pCliente.getCli_Endereco());

                System.out.println("DAOCliente.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }
}
